home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / 32SNIPIT.PAK / BLOCK.C < prev    next >
C/C++ Source or Header  |  1997-05-06  |  9KB  |  242 lines

  1. // BDE32 3.x - (C) Copyright 1996 by Borland International
  2.  
  3. // Block.c
  4. #include "snipit.h"
  5.  
  6. static const char szTblName[]       = "customer";
  7. static const char szCopyTblName[]   = "custcopy";
  8. static const char szTblType[] = szPARADOX;
  9.  
  10. #define FIELDLEN 30
  11.  
  12. static DBIResult CreateTable(hDBIDb hDb, hDBICur hCur, pCHAR szDestTblName,
  13.                              pCHAR szTblType, phDBICur phCurTemp);
  14.  
  15. //=====================================================================
  16. //  Function:
  17. //          Block();
  18. //
  19. //  Description:
  20. //          This example shows how to read and write records to a table
  21. //          in blocks. Moving records in blocks is the preferred method
  22. //          of reading and writing records to a table because it
  23. //          enhances the performance of the application.
  24. //=====================================================================
  25. void
  26. Block (void)
  27. {
  28.     DBIResult       rslt;          // Return value from IDAPI functions
  29.     hDBIDb          hDb;           // Handle to the database
  30.     hDBICur         hCur;          // Handle to the table
  31.     hDBICur         hCurCopy;      // Handle to a temporary table
  32.     CURProps        CurProps;      // Properties of the cursor
  33.     pBYTE           pRecBuf;       // Pointer to the record buffer
  34.     UINT32          uNumBuf = 10;  // Number of records to buffer
  35.     UINT32          uNumRecs = 10; // Number of records to display, 0=all
  36.     UINT16          uRecNum;       // Loop counter - current record number
  37.     UINT16          uRecOffset;    // Offset into the block of records
  38.     CHAR            DestBuf[34];   // New field value to write to the
  39.                                    // table 
  40.     CHAR            TempBuf[34];   // Field value read in from the table
  41.     BOOL            bBlank;        // Used to determine if a field is
  42.                                    // blank              
  43.  
  44.     Screen("*** Block maniplulation example ***\r\n");
  45.  
  46.     BREAK_IN_DEBUGGER();
  47.  
  48.     Screen("    Initializing IDAPI...");
  49.     if (InitAndConnect(&hDb) != DBIERR_NONE)
  50.     {                                       
  51.         Screen("\r\n*** End of Example ***");
  52.         return;
  53.     }
  54.  
  55.     Screen("    Setting the database directory...");
  56.     rslt = DbiSetDirectory(hDb, (pCHAR) szTblDirectory);
  57.     ChkRslt(rslt, "SetDirectory");
  58.  
  59.     Screen("    Open the %s table (source)...", szTblName);
  60.     rslt = DbiOpenTable(hDb, (pCHAR) szTblName, (pCHAR) szTblType,
  61.                         NULL, NULL, 0, dbiREADWRITE, dbiOPENSHARED,
  62.                         xltFIELD, FALSE, NULL, &hCur);
  63.     if (ChkRslt(rslt, "OpenTable") != DBIERR_NONE)
  64.     {
  65.         CloseDbAndExit(&hDb);
  66.         Screen("\r\n*** End of Example ***");
  67.         return;
  68.     }
  69.  
  70.     // Create a temporary table with the same field structure as the
  71.     //   source table.
  72.     if (CreateTable(hDb, hCur, (pCHAR) szCopyTblName,
  73.                             (pCHAR) szTblType, &hCurCopy) != DBIERR_NONE)
  74.     {
  75.         rslt = DbiCloseCursor(&hCur);
  76.         ChkRslt(rslt, "CloseCursor");
  77.         CloseDbAndExit(&hDb);
  78.         Screen("\r\n*** End of Example ***");
  79.         return;
  80.     }
  81.  
  82.     // Get the size of the record buffer.
  83.     rslt = DbiGetCursorProps(hCur, &CurProps);
  84.     ChkRslt(rslt, "GetCursorProps");
  85.  
  86.     // Allocate space for the record buffer.
  87.     pRecBuf = (pBYTE) malloc((UINT16) CurProps.iRecBufSize *
  88.                              (UINT16) sizeof(BYTE) *
  89.                              (UINT16) uNumBuf);
  90.     if (pRecBuf == NULL)
  91.     {
  92.         Screen("    Error - Out of memory");
  93.         CloseDbAndExit(&hDb);
  94.         return;
  95.     }
  96.  
  97.     Screen("    Go to the beginning of the %s table...", szTblName);
  98.     rslt = DbiSetToBegin(hCur);
  99.     ChkRslt(rslt, "SetToBegin");
  100.  
  101.     Screen("    Display the %s table...", szTblName);
  102.     DisplayTable(hCur, uNumRecs);
  103.  
  104.     Screen("\r\n    Go to the beginning of the %s table...", szTblName);
  105.     rslt = DbiSetToBegin(hCur);
  106.     ChkRslt(rslt, "SetToBegin");
  107.  
  108.     Screen("    Read %lu records from the %s table...", uNumBuf, szTblName);
  109.     rslt = DbiReadBlock(hCur, &uNumBuf, pRecBuf);
  110.  
  111.     // Getting an EOF error is alright - just means that an attempt was
  112.     //   made to read more records than are currently in the table.
  113.     if ((rslt != DBIERR_EOF) && (rslt != DBIERR_NONE))
  114.     {
  115.         ChkRslt(rslt, "ReadBlock");
  116.     }
  117.  
  118.     for (uRecNum = 0; uRecNum < uNumBuf; uRecNum++)
  119.     {
  120.         // Calculate the record offset.
  121.         uRecOffset = (UINT16)(uRecNum * CurProps.iRecBufSize),
  122.  
  123.         // Get the value in the second field for each record.
  124.         rslt = DbiGetField(hCur, 2, (pBYTE) &pRecBuf[uRecOffset],
  125.                            (pBYTE) TempBuf, &bBlank);
  126.         ChkRslt(rslt, "GetField");
  127.  
  128.         Screen("    Modify the record: add \"%u \" to %s", uRecNum + 1,
  129.                TempBuf);
  130.  
  131.         // Put the record number at the start of the field.
  132.         sprintf(DestBuf, "%u ", uRecNum + 1);
  133.         // Add the record number to the head of the field.
  134.         strncat(DestBuf, TempBuf, (FIELDLEN - strlen(DestBuf)));
  135.  
  136.         // Update the buffer value.
  137.         rslt = DbiPutField(hCur, 2, (pBYTE) &pRecBuf[uRecOffset],
  138.                            (pBYTE) DestBuf);
  139.         ChkRslt(rslt, "GetField");
  140.     }
  141.  
  142.     // Write uNumBuf records to the table.
  143.     Screen("\r\n    Write %lu records to the %s table...", uNumBuf,
  144.            szCopyTblName);
  145.     rslt = DbiWriteBlock(hCurCopy, &uNumBuf, pRecBuf);
  146.     ChkRslt(rslt, "WriteBlock");
  147.  
  148.     // Go to the beginning of the table.
  149.     Screen("\r\n    Go to the beginning of the %s table...", szCopyTblName);
  150.     rslt = DbiSetToBegin(hCurCopy);
  151.     ChkRslt(rslt, "SetToBegin");
  152.  
  153.     Screen("    Display the %s table...", szCopyTblName);
  154.     DisplayTable(hCurCopy, uNumRecs);
  155.  
  156.     // Cleanup
  157.  
  158.     free(pRecBuf);
  159.  
  160.     Screen("\r\n    Close the %s table...", szTblName);
  161.     rslt = DbiCloseCursor(&hCur);
  162.     ChkRslt(rslt, "CloseCursor");
  163.  
  164.     Screen("\r\n    Close the %s table...", szCopyTblName);
  165.     rslt = DbiCloseCursor(&hCurCopy);
  166.     ChkRslt(rslt, "CloseCursor");
  167.  
  168.     Screen("    Deleting the %s table...", szCopyTblName);
  169.     rslt = DbiDeleteTable(hDb, (pCHAR) szCopyTblName, (pCHAR) szTblType);
  170.     ChkRslt(rslt, "DeleteTable");
  171.  
  172.     Screen("    Close the database and exit IDAPI...");
  173.     CloseDbAndExit(&hDb);
  174.  
  175.     Screen("\r\n*** End of Example ***");
  176. }
  177.  
  178. //=====================================================================
  179. //  Function:
  180. //          CreateTable(hDb, hCur, szDestTblName, szTblType, phCurTemp);
  181. //
  182. //  Input:  hDb             - Handle to the database
  183. //          hCur            - Handle to the source table
  184. //          szDestTblName   - Name of the destination table
  185. //          szTblType       - Type of the table
  186. //          phCurTemp       - Cursor returned on the temporary table
  187. //
  188. //  Return: DBIResult       - Success of the operation, or what went
  189. //                          - wrong.
  190. //
  191. //  Description:
  192. //          This function is used to create a table and return a cursor
  193. //          to that table.
  194. //=====================================================================
  195. DBIResult
  196. CreateTable (hDBIDb hDb, hDBICur hCur, pCHAR szDestTblName,
  197.              pCHAR szTblType, phDBICur phCurTemp)
  198. {
  199.     DBIResult   rslt;       // Return value from IDAPI functions
  200.     CRTblDesc   crTblDesc;  // Table descriptor
  201.     pFLDDesc    pfldDescs;  // Field descriptor
  202.     CURProps    curProps;   // Cursor properties
  203.  
  204.     // Allocate memory for the field descriptor.
  205.     rslt = DbiGetCursorProps(hCur, &curProps);
  206.     ChkRslt(rslt, "GetCursorProps");
  207.  
  208.     pfldDescs = (pFLDDesc)malloc(curProps.iFields * sizeof(FLDDesc));
  209.  
  210.     // Get information on the fields of the table.
  211.     rslt = DbiGetFieldDescs(hCur, pfldDescs);
  212.     ChkRslt(rslt, "GetFieldDescs");
  213.  
  214.     // Initialize create table descriptor.
  215.     memset((void *)&crTblDesc, 0, sizeof(crTblDesc));
  216.     strcpy(crTblDesc.szTblName, szDestTblName);
  217.     strcpy(crTblDesc.szTblType, szTblType);
  218.     crTblDesc.iFldCount = curProps.iFields;
  219.     crTblDesc.pfldDesc  = pfldDescs;
  220.  
  221.     // Create & open the table
  222.     rslt = DbiCreateTable(hDb, TRUE, &crTblDesc);
  223.     if (ChkRslt(rslt, "    CreateTable") != DBIERR_NONE)
  224.     {
  225.         free(pfldDescs);
  226.         return rslt;
  227.     }
  228.  
  229.     rslt = DbiOpenTable(hDb, crTblDesc.szTblName, crTblDesc.szTblType,
  230.                         NULL, NULL, 0, dbiREADWRITE, dbiOPENSHARED,
  231.                         xltFIELD, FALSE, NULL, phCurTemp);
  232.     if (ChkRslt(rslt, "OpenTable") != DBIERR_NONE)
  233.     {
  234.         free(pfldDescs);
  235.         return rslt;
  236.     }
  237.  
  238.     free(pfldDescs);
  239.  
  240.     return rslt;
  241. }
  242.